package com.imooc.coupon.controller;

import com.imooc.coupon.exception.CouponException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.serviceregistry.Registration;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 优惠券模板服务健康检查控制器
 *
 * Created By TINY
 * Create Time 2020/2/10
 **/
@Slf4j
@RestController
public class HealthCheckController {

    /** 服务发现客户端，可到 Eureka Server 获取（其它或自身）微服务的信息 */
    private final DiscoveryClient client;

    /** 服务注册接口， 可以获取服务 id */
    private final Registration registration;

    @Autowired
    @SuppressWarnings("all")
    public HealthCheckController(
            DiscoveryClient client, Registration registration) {
        this.client = client;
        this.registration = registration;
    }

    /**
     * 优惠券模板服务健康检查接口
     * 接口地址： 127.0.0.1:7001/coupon-template/health
     *
     * @return 服务可用消息
     */
    @GetMapping("/health")
    public String health() {
        log.debug("优惠券模板服务就绪！");
        return "优惠券模板服务就绪！";
    }

    /**
     * 该接口用于验证通用异常处理功能是否可用
     * 接口地址： 127.0.0.1:7001/coupon-template/exception
     *
     * @return 异常信息
     * @throws CouponException 通用业务异常
     */
    @GetMapping("/exception")
    public String exception() throws CouponException {
        log.debug("检查通用异常处理功能是否可用");
        throw new CouponException("优惠券模板服务出现了一些问题");
    }

    /**
     * 获取 Eureka Server 上的微服务相关元信息
     * 接口地址： 127.0.0.1:7001/coupon-template/info
     *
     * @return 微服务元信息
     */
    @GetMapping("/info")
    public List<Map<String, Object>> info() {

        // 大约需要等待两分钟才可以获取到 Eureka Server 中的服务元信息

        // 根据当前服务 id 获取所有服务实例
        List<ServiceInstance> instances = client.getInstances(
                registration.getServiceId());

        List<Map<String, Object>> result =
                new ArrayList<>(instances.size());

        instances.forEach(i -> {
            Map<String, Object> info = new HashMap<>();

            info.put("serviceId", i.getServiceId());   // 服务 id
            info.put("instanceId", i.getInstanceId()); // 实例 id
            info.put("port", i.getPort());             // 服务端口

            result.add(info);
        });

        return result;
    }
}
